
#pragma once

namespace atr {

/**
 * @brief Namespace only for internal use of atr library
 * @details Please don't use this namespace outside the atr library. IF you REALLY need to - do it with special care.
 */
namespace __ {

template <typename Prev, typename Next>
    struct __pop {};

template <template <class ...> class Base, typename ... Prevs,
                                           typename Type>
struct __pop<Base<Prevs...>, Base<Type>>
{
    using pop_front = Base<>; // list only
    using pop_back = Base<Prevs...>;
};

template <template <class ...> class Base, typename ... Prevs,
                                           typename Type,
                                           typename ... Nexts>
struct __pop<Base<Prevs...>, Base<Type, Nexts...>>
    : public __pop<Base<Prevs..., Type>, Base<Nexts...>>
    { using pop_front = Base<Nexts...>; }; // list only


} // namespace __
} // namespace atr